g++ test.cpp -g -o test gdb test #调试程序 gdb test -tui #显示代码窗口
另一种方式:
1 2
gdb #启动gdb file test #用file命令来启动对test的调试
gdb调试没有链接源码
1
gdb> set directories pathname
设置参数
1 2 3 4 5 6 7 8
方法1: (gdb)> set args xxx1 xxx2 (gdb)> show args 方法2: (gdb)> b 22 (gdb)> run xxx1 xxx2 方法3: root@~# gdb --args xxx1
断点管理
1 2 3 4 5 6 7
b <行号> #添加断点,b:breakpoint的简写 b <函数名> #添加断点 b <行号> if 表达式 #添加条件断点(好用) d <断点编号> #根据编号删除断点,d:delete(不好用啊) d #删除所有断点,delete也可以(可能会用到) clear <行号> #删除某行断点(好用) i b #查看断点
运行程序
1 2 3
r #run的简写 list #显示代码,如果显示不全再点个回车 list 行号 #显示以该行为中心的一段代码
控制调试进程
1 2 3 4 5 6
n #单步执行,不跳入函数,next的简写(vs中F10) s #真正的单步执行,跳入函数,step(vs中F11) continue #继续运行程序到下一个断点(vs中F5) until #跳出当前循环或语句块 until <行号> #继续运行到某一行 finish #跳出函数
#永久设置core文件大小和存储位置 vim /etc/profile ulimit -c unlimited echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern
gdb调试core文件
1 2 3 4 5 6 7 8 9 10 11
#启动gdb调试core gdb test core.xxx.xxx
#查看堆栈 bt 或 where
#跳转到1号栈帧 f 1
#打开该帧函数的反汇编代码 disassemble
调试多线程
几个常用命令
1 2 3 4 5 6 7 8 9 10 11
#打印线程信息 info threads
#查看所有线程的堆栈信息 thread apply all bt
#查看指定线程的堆栈信息 thread apply 5 bt
#进入指定线程栈空间 thread 5
1 2
1 2
其他
PS:只要没有歧义,大部分命令都可以只输入第一个字母.
1 2 3 4 5 6
q #退出gdb bt #查看堆栈,backtrace简写 info locals #显示当前函数中的所有变量值 cgdb test #一个可视化调试工具. (gdb) wi #可视化调试 (gdb) whatis a #查看变量类型
调试时重定向 run < test.txt
问题记录
1.No frame is currently executing in specified block Command aborted. 问题原因:使用watch监视变量tmp,但是程序运行到tmp未定义的地方了. 解决方法:info watch查看变量tmp的编号,delete <编号> 就可以了.
v1.5.2